extends Node2D
@onready var 格子矩阵 = $"格子矩阵"

var 数字矩阵:Array=[]

func _ready():
	randomize()
	初始化格子矩阵()
	刷新格子矩阵()	
	
func 初始化格子矩阵():
	for i in range(4):
		var 数组:Array[int]=[0,0,0,0]
		数字矩阵.append(数组)
	随机生成数字()
	随机生成数字()
	
func 刷新格子矩阵():
	for i in range(4):
		for j in range(4):
			var index=i*4+j
			格子矩阵.get_child(index).设置数字(数字矩阵[i][j])

func _input(event):
	if event.is_action_pressed("ui_down"):
		往下移动矩阵()
		判断输赢()
	if event.is_action_pressed("ui_up"):
		往上移动矩阵()
		判断输赢()
	if event.is_action_pressed("ui_left"):
		往左移动矩阵()
		判断输赢()
	if event.is_action_pressed("ui_right"):
		往右移动矩阵()
		判断输赢()

func 往下移动矩阵():
	for j in range(4):
		for i in range(3,-1,-1):
			if 数字矩阵[i][j]!=0:
				var k=i
				while k<3 and 数字矩阵[k+1][j]==0:
					数字矩阵[k+1][j]=数字矩阵[k][j]
					数字矩阵[k][j]=0
					k+=1
				if k<3 and 数字矩阵[k+1][j]==数字矩阵[k][j]:
					数字矩阵[k+1][j]*=2
					数字矩阵[k][j]=0
	
func 往上移动矩阵():
	for j in range(4):
		for i in range(4):
			if 数字矩阵[i][j]!=0:
				var k=i
				while k>0 and 数字矩阵[k-1][j]==0:
					数字矩阵[k-1][j]=数字矩阵[k][j]
					数字矩阵[k][j]=0
					k-=1
				if k>0 and 数字矩阵[k-1][j]==数字矩阵[k][j]:
					数字矩阵[k-1][j]*=2
					数字矩阵[k][j]=0

func 往左移动矩阵():
	for i in range(4):
		for j in range(4):
			if 数字矩阵[i][j]!=0:
				var k=j
				while k>0 and 数字矩阵[i][k-1]==0:
					数字矩阵[i][k-1]=数字矩阵[i][k]
					数字矩阵[i][k]=0
					k-=1
				if k>0 and 数字矩阵[i][k-1]==数字矩阵[i][k]:
					数字矩阵[i][k-1]*=2
					数字矩阵[i][k]=0
	
func 往右移动矩阵():
	for i in range(4):
		for j in range(3,-1,-1):
			if 数字矩阵[i][j]!=0:
				var k=j
				while k<3 and 数字矩阵[i][k+1]==0:
					数字矩阵[i][k+1]=数字矩阵[i][k]
					数字矩阵[i][k]=0
					k+=1
				if k<3 and 数字矩阵[i][k+1]==数字矩阵[i][k]:
					数字矩阵[i][k+1]*=2
					数字矩阵[i][k]=0

func 设置矩阵格子(index:int,value:int):
	var i:int=index/4
	var j:int=index%4
	数字矩阵[i][j]=value

func 获取矩阵格子(index:int):
	var i:int=index/4
	var j:int=index%4
	return 数字矩阵[i][j]	

func 随机生成数字():
	if 有空格子():
		while true:
			var index=randi_range(0,15)
			if 获取矩阵格子(index)==0:
				设置矩阵格子(index,2)
				break
			
func 有空格子():
	for i in range(4):
		for j in range(4):
			if 数字矩阵[i][j]==0:
				return true
	return false

func 游戏失败():
	for i in range(4):
		for j in range(4):
			if 数字矩阵[i][j]==0:
				return false
			if i<3 and 数字矩阵[i+1][j]==数字矩阵[i][j]:
				return false
			if j<3 and 数字矩阵[i][j]==数字矩阵[i][j+1]:
				return false
	return true

func 游戏胜利():
	for i in range(4):
		for j in range(4):
			if 数字矩阵[i][j]==2048:
				return true
	return false
	
func 判断输赢():
	if 游戏胜利():
		print("游戏胜利")
	elif !游戏失败():
		随机生成数字()
	else:
		print("游戏结束")
	刷新格子矩阵()
